package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * [高级流]对象流---传输对象---实现序例化接口Serializable  功能：将对象转换为二进制
 *                          版本号：一定要写，对象写出，对象读入，必须统一版本号
 *
 * ObjectOutputStream  对象输出流       写出---Person.java
 * ObjectInputStream  对象输入流        读入---Person.java
 */
public class ObjectIO {

    /**
     * ObjectOutputStream  对象输出流 / 序列化
     */
    //需求： 将 Person.java 文件  变成对象  写出--序例化
    @Test
    public void testOOS() throws IOException {
        //传输对象：创建实现序例化接口对象
        Person p=new Person();
        p.setNames("韩美娟");
        // String[] say=new String[]{}  字符串数组-->动态数组传输方式--给定元素决定数组长度
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});
        //System.out.println(p.toString());
        //创建低级流---写出   对象格式：person.obj

        FileOutputStream fos=null;
        ObjectOutputStream oos=null;
        //创建符合条件对象---输出流 ：xxx.obj  文件是一种对象文件保存模式
        try {
            fos=new FileOutputStream("person.obj");
            //高级流：ObjectOutputStream
            oos=new ObjectOutputStream(fos);

            oos.writeObject(p);
            System.out.println("写出成功~");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos!=null)
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        /**
         * writeObject(Object obj)---写出对象
         * 作用：将给定对象按照其结构进行转换，转换为一组”组“字节，
         *      在通过处理的流写出,写出模式： xxx.obj
         *
         * Person 类---去掉实现序例化接口：Serializable
         * 抛出异常：NotSerializableException 没有实现序例化接口
         * 原因：传输对象上没有实现 Serializable序例化接口
         *
         * 对象文件写出操作传输需要经过2个步骤：（专业术语）
         * 1.通过对象输出流将Person类，转换为一组”组“字节，这个过程对象序例化
         * 2.将序例化后的字节在通过字节流(低级流)写出到项目中，（硬盘上）做长久
         *   的保存，这个过程：数据持久化！
         */

    }

    /**
     * ObjectInputStream 对象输入流 / 反序列化
     * 反序列化---二进制转换为对象
     *
     * InvalidClassException 反序列化出现异常：版本号不匹配
     *
     *
     * ClassNotFoundException   没有这个类型异常
     *                          产生原因：读入对象不正确，永久保存数据，类型读入不对
     *                                 person1.class  person.obj
     *                                 person2.class
     */
    @Test
    public void testOIS() {
        FileInputStream fis=null;
        ObjectInputStream ois=null;

        //创建输入流---person.obj --读入
        try {
            fis=new FileInputStream("person.obj");
            //创建高级流---对象输入流
            ois=new ObjectInputStream(fis);
            //readObject() 返回读取的对象，反序列操作
            System.out.println(ois.readObject());
        } catch (IOException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if (ois!=null)
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

    }

}
